﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace QuanLyHocPhi.GUI.DuLieu
{
    using BLL;
    using Model;

    public partial class SelectSinhVienDialog : QuanLyHocPhi.GUI.FormBaseDialog
    {
        public SelectSinhVienDialog()
        {
            InitializeComponent();
        }

        #region Trường đang chọn
        private Truong SelectedTruong
        {
            get
            {
                if (bsTruong.DataSource == null)
                    return null;
                if (bsTruong.Current == null)
                    return null;
                return bsTruong.Current as Truong;
            }
        }

        private string SelectedMaTruong
        {
            get
            {
                if (SelectedTruong == null)
                    return null;
                else
                    return SelectedTruong.MaTruong;
            }
        }
        #endregion

        #region Lớp đang chọn
        /// <summary>
        /// Lớp không chuyên đang chọn
        /// </summary>
        private Lop SelectedLop
        {
            get
            {
                if (bsLop.DataSource == null)
                    return null;
                if (bsLop.Current == null)
                    return null;
                return bsLop.Current as Lop;
            }
        }

        /// <summary>
        /// Mã lớp không chuyên đang chọn
        /// </summary>
        private string SelectedMaLop
        {
            get
            {
                var selectedLop = this.SelectedLop;
                if (SelectedLop != null)
                    return selectedLop.MaLop;
                else
                    return null;
            }
        }
        #endregion

        public SinhVien SelectedSinhVien
        {
            get
            {
                if (bsSinhVien.Current == null)
                    return null;
                return bsSinhVien.Current as SinhVien;
            }
        }

        /// <summary>
        /// Năm tuyển sinh đang chọn
        /// </summary>
        private string SelectedNamTuyenSinh
        {
            get
            {
                if (cbxNamTuyenSinh.SelectedItem == null)
                    return null;
                else
                    return cbxNamTuyenSinh.SelectedItem.ToString();
            }
        }

        private void OnLoad(object sender, EventArgs e)
        {
            #region Danh sách trường
            cbxTruong.DisplayMember = "TenTruong";
            cbxTruong.ValueMember = "MaTruong";
            #endregion

            #region Danh sách lớp
            gridLop.AllowUserToAddRows = false;
            gridLop.AllowUserToDeleteRows = false;
            gridLop.ReadOnly = true;
            gridLop.AutoGenerateColumns = false;
            colLop_MaLop.DataPropertyName = "MaLop";
            colLop_TenLop.DataPropertyName = "TenLop";
            bsLop.DataSource = null;
            gridLop.DataSource = bsLop;
            #endregion

            #region Danh sách sinh viên
            colSinhVien_MaSinhVien.DataPropertyName = "MaSinhVien";
            colSinhVien_HoDem.DataPropertyName = "HoDem";
            colSinhVien_Ten.DataPropertyName = "Ten";
            colSinhVien_NgaySinh.DataPropertyName = "NgaySinh";
            colSinhVien_HeSoMienGiam.DataPropertyName = "HeSoMienGiam";
            gridSinhVien.AutoGenerateColumns = false;
            gridSinhVien.ReadOnly = true;
            gridSinhVien.AllowUserToAddRows = false;
            gridSinhVien.AllowUserToDeleteRows = false;
            bsSinhVien.DataSource = null;
            gridSinhVien.DataSource = bsSinhVien;
            #endregion

            this.LockUpdate();
            NapDanhSachTruong(null);
            NapDanhSachNamTuyenSinh(null);
            NapDanhSachLop(null);
            NapThongTinLopKhongChuyen();
            gridLop.UseAsListBox = true;
            this.UnlockUpdate();
        }

        /// <summary>
        /// Nạp danh sách trường
        /// </summary>
        /// <param name="maTruongToFocus">mã trường được highlight sau khi nạp danh sách trường xong</param>
        private void NapDanhSachTruong(string maTruongToFocus)
        {
            var lstTruong = BizTruong.GetList_Truong();
            bsTruong.DataSource = lstTruong;
            cbxTruong.DataSource = bsTruong;

            if (maTruongToFocus.IsNullOrEmpty() == false)
            {
                for (int i = 0; i < lstTruong.Count; i++)
                    if (lstTruong[i].MaTruong == maTruongToFocus)
                    {
                        bsTruong.Position = i;
                        break;
                    }
            }
        }

        /// <summary>
        /// Nạp danh sách năm tuyển sinh của trường đang chọn
        /// </summary>
        /// <param name="namTuyenSinhToFocus"></param>
        private void NapDanhSachNamTuyenSinh(string namTuyenSinhToFocus)
        {
            string maTruong = this.SelectedMaTruong;
            if (maTruong.IsNullOrEmpty())
            {
                cbxNamTuyenSinh.DataSource = null;
            }
            else
            {
                List<string> lstNamTuyenSinh = BizTruong.GetList_NamTuyenSinh(maTruong);
                cbxNamTuyenSinh.DataSource = lstNamTuyenSinh;
                if (namTuyenSinhToFocus != null)
                    for (int i = 0; i < lstNamTuyenSinh.Count; i++)
                        if (lstNamTuyenSinh[i] == namTuyenSinhToFocus)
                        {
                            cbxNamTuyenSinh.SelectedIndex = i;
                            break;
                        }
            }
        }

        /// <summary>
        /// Nạp danh sách lớp thuộc trường trong năm tuyển sinh cụ thể
        /// </summary>
        /// <param name="maTruong"></param>
        /// <param name="namTuyenSinh"></param>
        private void NapDanhSachLop(string maLopToFocus)
        {
            string maTruong = this.SelectedMaTruong;
            string namTuyenSinh = this.SelectedNamTuyenSinh;

            if (maTruong.IsNullOrEmpty() || namTuyenSinh.IsNullOrEmpty())
                bsLop.DataSource = null;
            else
            {
                var lstLop = BizTruong.GetList_LopKhongChuyen(maTruong, Convert.ToInt32(namTuyenSinh));
                bsLop.DataSource = lstLop;
                if (maLopToFocus.IsNullOrEmpty() == false)
                {
                    for (int i = 0; i < lstLop.Count; i++)
                        if (lstLop[i].MaLop == maLopToFocus)
                        {
                            bsLop.Position = i;
                            break;
                        }
                }
            }

            #region Binding dữ liệu danh sách lớp
            gridLop.DataSource = bsLop;
            lblTruong_ThongKeSoLop.Text = string.Format("Danh sách có {0} lớp", bsLop.Count);
            #endregion
        }

        #region Hiển thị thông tin của lớp không chuyên, danh sách sinh viên
        private void OnBsLopCurrentChanged(object sender, EventArgs e)
        {
            if (m_LockUpdate)
                return;
            NapThongTinLopKhongChuyen();
        }

        private void NapThongTinLopKhongChuyen()
        {
            Lop lop = this.SelectedLop;

            // Nạp thông tin sinh viên thuộc lớp đang chọn
            IList<SinhVien> lstSinhVien = null;
            if (lop == null)
            {
                lblLop_ThongKeSoSinhVien.Text = "";
            }
            else
            {
                lstSinhVien = BizLopGoc.GetListSinhVien(lop.MaLop);
            }
            bsSinhVien.DataSource = lstSinhVien;
            lblLop_ThongKeSoSinhVien.Text = string.Format("Danh sách có {0} sinh viên", bsSinhVien.Count);
            OnBsSinhVienCurrentChanged(null, null);
        }
        #endregion

        private void OnBsTruongCurrentChanged(object sender, EventArgs e)
        {
            if (m_LockUpdate)
                return;
            m_LockUpdate = true;
            NapDanhSachNamTuyenSinh(this.SelectedNamTuyenSinh);
            NapDanhSachLop(this.SelectedLop != null ? this.SelectedLop.MaLop : null);
            NapThongTinLopKhongChuyen();
            m_LockUpdate = false;
        }

        private void OnCbxNamTuyenSinhSelectedIndexChanged(object sender, EventArgs e)
        {
            if (m_LockUpdate)
                return;
            this.LockUpdate();
            NapDanhSachLop(null);
            NapThongTinLopKhongChuyen();
            this.UnlockUpdate();
        }

        private void OnBsSinhVienCurrentChanged(object sender, EventArgs e)
        {
            btnOK.Enabled = this.SelectedSinhVien != null;
        }

        private void OnOKClick(object sender, EventArgs e)
        {
            this.DialogResult = System.Windows.Forms.DialogResult.OK;
            this.Close();
        }
    }
}
